jqとcolumnでAWS CLIの出力を見やすく整形する
AWS CLIを使う上で、JSONパーサjq
はとても強力です。
例えば「あるEC2インスタンスが含まれるELBは何と何か」を調べようと思ったら、
$ aws elb describe-load-balancers | \ jq -c '.[][] | [.LoadBalancerName, .Instances[][]]'
こうして得られた一覧からgrepしてやれば良いですし、
["api-elb","i-2939xxxx","i-0387ba542xxxxyyyy"] ["local-elb","i-b983xxxx","i-e6d0xxxx","i-2939xxxx","i-9477xxxx"] :
「あるRDSパラメータグループを使っているRDSは何か」を調べようと思ったら、
$ aws rds describe-db-instances | \ jq -c '.[][] | [.DBInstanceIdentifier, .DBParameterGroups[].DBParameterGroupName]'
としてやれば一覧が手に入ります。
["api-rdb01","db-rds-dbparamgroup01"] ["web-rdb01","default.mysql5.6"] :
EC2インスタンスの名前(Nameタグ)の様に多少複雑な検索が必要なものも、
$ aws ec2 describe-instances | \ jq -c '.[][].Instances[] | [.InstanceId, [.Tags[] | select(.Key == "Name").Value][], .InstanceType]'
jq
だけで完結できます。
["i-e6ebxxxx","web-api02-test","t2.small"] ["i-0f8506c19a8c7xxxx","web009","m4.large"] :
ただしこのままだと、 ご覧の通りJSONっぽいフォーマットのままなので、桁が揃っておらずちょっと見にくいです。
jq
には CSV や TSV で出力するモードもあるので、そちらを使ってExcelなどに貼り付けるのも手ではありますが、ちょっと確認したいだけであればそれも冗長です。
表示の桁を揃えてくれる column コマンド
なんとかならないかと思って探してみたところ、column
というコマンドの存在を知りました。
column は、入力を複数カラムに分けて整形します。
調べたところ昔からあるコマンドだったのですが、浅学の身でまったく知りませんでした。OSXにも標準でインストールされていました。
せっかくなので早速使ってみます。
ELBとインスタンスIDの一覧:
$ aws elb describe-load-balancers | \ jq -r '.[][] | [.LoadBalancerName, .Instances[][]] | @tsv' | \ column -t
api-elb i-2939xxxx i-0387ba542xxxxyyyy local-elb i-b983xxxx i-e6d0xxxx i-2939xxxx i-9477xxxx :
RDSとRDSパラメータグループの一覧:
$ aws rds describe-db-instances | \ jq -r '.[][] | [.DBInstanceIdentifier, .DBParameterGroups[].DBParameterGroupName] | @tsv' | \ column -t
api-rdb01 db-rds-dbparamgroup01 web-rdb01 default.mysql5.6 :
インスタンスIDとインスタンス名、インスタンスタイプの一覧:
$ aws ec2 describe-instances | \ jq -r '.[][].Instances[] | [.InstanceId, [.Tags[] | select(.Key == "Name").Value][], .InstanceType] | @tsv' | \ column -t
i-e6ebxxxx web-api02-test t2.small i-0f8506c19a8c7xxxx web009 m4.large :
うまい具合に縦の桁をそろえて表示してくれました。
実行にあたっては、
jq
のオプションを-c
(--compact-output
) ではなく-r
(--raw-output
) にする| @tsv
をつける- パイプして
column -t
に渡す
といったところがポイントになります。
EC2インスタンスのPublicIpAddress
のように、付いていたりいなかったりするものが途中のカラムにあると桁がずれてしまいます。そうなりそうな項目は後ろの方に回すなどの工夫をすると良いでしょう。
参考
jq
についてはここでも何度も記事になっています。特に下記の記事は参考にさせてもらいました。
ちなみに
以前下記のようなツールを作った記事を書いたのですが、
同じことをjq
+column
でやろうとするとこうなります。
こちらは前述の、空白のカラムが有ると表示が崩れる問題をケアしてみました。
@tsv
の代わりに@csv
を使い、column
ではセパレータに,
を使うようにしています。
ここまで複雑になると実用上どうなのという気はしますが、やっぱり、自作のスクリプトを使わずにすむ・メンテが行き届いた汎用コマンドが使えるというのはうれしいですね。